#include <iostream>
#include <queue>
#include <list>
using namespace std;

//int main() {
//    int q;
//    cin >> q;
//    int a, b, c;
//    while (q--)
//    {
//        cin >> a >> b >> c;
//        int sum = 0;
//        while (a && b && c)
//        {
//            a--;
//            b--;
//            c--;
//            sum += 2;
//        }
//        if (b >= 2)
//        {
//            sum += (b - 1);
//        }
//        cout << sum << endl;
//    }
//    return 0;
//}
//
//class Solution {
//public:
//    int n, m;
//    int dx[4] = { 0,0,1,-1 };
//    int dy[4] = { 1,-1,0,0 };
//    queue<pair<int, int>> q;
//    int k = 0;
//    int ret = 0;
//
//    int dfs(vector<vector<int> >& grid)
//    {
//        for (int i = 0; i < n; i++)
//        {
//            for (int j = 0; j < m; j++)
//            {
//                if (grid[i][j] == 1)
//                {
//                    k++;
//                }
//                else if (grid[i][j] == 2)
//                {
//                    q.push(pair<int, int>(i, j));
//                }
//            }
//        }
//        while (q.size())
//        {
//            int pre = q.size();
//            ret++;
//            while (pre--)
//            {
//                auto [x1, y1] = q.front();
//                for (int i = 0; i < 4; i++)
//                {
//                    int x = dx[i] + x1;
//                    int y = dy[i] + y1;
//                    if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 1)
//                    {
//                        grid[x][y] = 2;
//                        q.push(pair<int, int>(x, y));
//                        k--;
//                    }
//                    if (k == 0)
//                    {
//                        return ret;
//                    }
//                }
//                q.pop();
//            }
//        }
//        return -1;
//    }
//
//    int rotApple(vector<vector<int> >& grid) {
//        // write code here
//        n = grid.size();
//        m = grid[0].size();
//        return dfs(grid);
//    }
//};
//
//class Solution {
//public:
//    int LastRemaining_Solution(int n, int m) {
//        // write code here
//        int f = 0;
//        for (int i = 2; i <= n; i++)
//        {
//            f = (f + m) % i;
//        }
//        return f;
//    }
//};

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> ret(m, vector<int>(n));
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> ret[j][i];
        }
    }
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << ret[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

class Solution {
public:
    long long maxWater(vector<int>& arr) {
        // write code here
        int n = arr.size();
        vector<int> left(n);
        vector<int> right(n);
        left[0] = arr[0];
        for (int i = 1; i < n; i++)
        {
            left[i] = max(left[i - 1], arr[i]);
        }
        right[n - 1] = arr[n - 1];
        for (int i = n - 2; i >= 0; i--)
        {
            right[i] = max(right[i + 1], arr[i]);
        }
        long long ret = 0;
        for (int i = 1; i < n - 1; i++)
        {
            ret += min(left[i], right[i]) - arr[i];
        }
        return ret;
    }
};


int cnt[5] = { 0 };
int m = 0, x = 0, y = 0;
bool arr[13][13] = { 0 };
long long num = 0;
vector<int> path;

bool isSame(int i, int j)
{
    for (int k = 1; k < i; k++)
    {
        if (arr[i][k] && path[k] != j)
        {
            return false;
        }
    }
    return true;
}

void nums(int i)
{
    if (i > 12)
    {
        num++;
        return;
    }
    for (int j = 1; j < 5; j++)
    {
        if (cnt[j] == 0)
        {
            continue;
        }
        if (!isSame(i, j))
        {
            continue;
        }
        cnt[j]--;
        path.push_back(j);
        nums(i + 1);
        cnt[j]++;
        path.pop_back();
    }
}

int main() {
    for (int i = 1; i < 5; i++)
    {
        cin >> cnt[i];
    }
    cin >> m;
    while (m--)
    {
        cin >> x >> y;
        arr[x][y] = arr[y][x] = true;
    }
    path.push_back(0);
    nums(1);
    cout << num << endl;
    return 0;
}